Brian Durán

Tarea: Sesión 4 y 5


I Parte


  1. Sea \(P=(2,3)\), \(Q=(5,2)\), \(R=(2,-5)\) y \(S=(1,-2)\). Calcule \(proy_{\vec{PQ}}\vec{RS}\).

\(\vec{PQ}\)

q <- c(5,2)
p <- c(2,3)
pq <- q - p
pq
[1]  3 -1

\(\vec{RS}\)

r <- c(2,-5)
s <- c(1,-2)
rs <- s - r
rs
[1] -1  3


\(proy_{\vec{PQ}}\vec{RS}\)


proy <- project(rs, pq)

fractions(proy)
[1] -9/5  3/5


  1. Sea \(u = (-2,1,6)\) y \(v = (2,4,5)\), comprueba que el vector \(w\) dado por \(w = u - \frac{u \cdot v}{\|v\|^2} v\) Es un vector ortogonal con \(v\)

Calculamos:

\(u \cdot v\)

u <- c(-2,1,6)
v <- c(2,4,5)
sum(u*v)
[1] 30

\({\|v\|^2}\)


v2 <- norm(v, type="2")^2
v2
[1] 45

\(w = u - \frac{u \cdot v}{\|v\|^2} v\)


prod_punto_u_v = sum(u*v)

w = u - ((prod_punto_u_v / v2) * v)

w = fractions(w)

sum(w*v)
[1] 0
subspace(as.matrix(w),as.matrix(v))
[1] 1.570796
180*subspace(as.matrix(w),as.matrix(v))/pi
[1] 90

\(W _{\bot } V ?\)

w es ortogonal con v, ya que la múltiplicación entre ellos es igual a cero. Además de que el ángulo que los separa es igual a \(\pi\ /2\)

  1. Sean \(A=(3,0,0)\), \(B=(1,0,2)\), \(C=(2,3,0)\) puntos en el espacio (\(R^3\)).

Con estos puntos:

  1. Determine si el triángulo \(ABC\) es rectángulo, obtusángulo o acutángulo.
a <- c(3,0,0)
b <- c(1,0,2)
c <- c(2,3,0)

ab <- b-a
bc <- c-b
ca <- c-a

Respuesta: El triángulo es acutángulo, ya que todos sus ángulos se encuentran entre 0 y 90 grados.

  1. Determine el perímetro del triángulo \(ABC\)
norma_ab <- norm(ab, type="2")
norma_bc <- norm(bc, type="2")
norma_ca <- norm(ca, type="2")

norma_ab + norma_bc + norma_ca
[1] 9.732362
  1. Determine el área del triángulo ABC
semiperimetro <- perimetro / 2

# Por formula de Héron
area = sqrt(semiperimetro * (semiperimetro - norma_ab) * (semiperimetro - norma_bc) * (semiperimetro - norma_ca))

area
[1] 4.358899


II Parte


  1. Compruebe que la matriz P, es ortogonal:
p <- matrix(c(1/2, 1/2, 1/2, 1/2, 
              (1/sqrt(2)), -(1/sqrt(2)), 0, 0, 
              (1/sqrt(6)), (1/sqrt(6)), -(2/sqrt(6)), 0, 
              (1/(2*sqrt(3))), (1/(2*sqrt(3))), (1/(2*sqrt(3))), -(3/(2*sqrt(3)))), 
              nrow=4, ncol=4, byrow=TRUE)

matriz_p <- fractions(p)

matriz_p
     [,1]           [,2]           [,3]           [,4]          
[1,]            1/2            1/2            1/2            1/2
[2,]      2378/3363     -5741/8119              0              0
[3,]    19402/47525    19402/47525  -86329/105731              0
[4,]   75658/262087   75658/262087   75658/262087 -489061/564719
p_inversa <- solve(matriz_p)

fractions(p_inversa)
     [,1]           [,2]           [,3]           [,4]          
[1,]            1/2      2378/3363    19402/47525   75658/262087
[2,]            1/2     -5741/8119    19402/47525   75658/262087
[3,]            1/2              0  -86329/105731   75658/262087
[4,]            1/2              0              0 -489061/564719
p_transpuesta <- t(p)

fractions(p_transpuesta)
     [,1]           [,2]           [,3]           [,4]          
[1,]            1/2      2378/3363    19402/47525   75658/262087
[2,]            1/2     -5741/8119    19402/47525   75658/262087
[3,]            1/2              0  -86329/105731   75658/262087
[4,]            1/2              0              0 -489061/564719

La matriz P es ortogonal puesto que su inversa y su transpuesta son iguales.

  1. Demuestre que A es indempotente.
a <- matrix(c(2, -2, -4, 
              -1, 3, 4,
              1, -2, -3), 
              3, 3, byrow=TRUE)


a
     [,1] [,2] [,3]
[1,]    2   -2   -4
[2,]   -1    3    4
[3,]    1   -2   -3
a%*%a
     [,1] [,2] [,3]
[1,]    2   -2   -4
[2,]   -1    3    4
[3,]    1   -2   -3

La matriz A es idempotente puesto que es igual a ella misma al cuadrado.

  1. Determine la composición \(f(m)\)
m <- matrix(c(3/2, -5/2, 
              2/3, -1/3), 
              2, 2, byrow=TRUE)

fractions(m)
     [,1] [,2]
[1,]  3/2 -5/2
[2,]  2/3 -1/3
m3 <- m%*%m%*%m

m2 <- m%*%m

fx = 6*m3 + 3*m2 - m

fractions(fx)
     [,1]   [,2]  
[1,]  -37/6  -55/6
[2,]   22/9 -116/9
  1. Encuentre la matriz inversa y el determinante de cada una de las siguientes matrices:

a <- matrix(c(1, 2, 3, 
              2, 5, 7,
              -2, -4, -5), 
              3, 3, byrow=TRUE)

solve(a)
     [,1] [,2] [,3]
[1,]    3   -2   -1
[2,]   -4    1   -1
[3,]    2    0    1
det(a)
[1] 1
b <- matrix(c(3, -2, -1, 
              -4, 1, -1,
              2, 0, 1), 
              3, 3, byrow=TRUE)

solve(b)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    5    7
[3,]   -2   -4   -5
det(b)
[1] 1
c <- matrix(c(0, 2, 1, 
              1, 3, -1,
              -1, 1, 2), 
              3, 3, byrow=TRUE)

fractions(solve(c))
     [,1] [,2] [,3]
[1,]  7/2 -3/2 -5/2
[2,] -1/2  1/2  1/2
[3,]    2   -1   -1
det(c)
[1] 2
d <- matrix(c(3, 6, 9, 
              2, 5, 1,
              1, 1, 8), 
              3, 3, byrow=TRUE)

det(d)
[1] 0

La última matriz no tiene inversa puesto que el determinante es cero, es decir la matriz es singular o invertible.

Que relación existe entre las matrices que poseen inversas y el valor de su determinante? Sug: revisar la teoría vista en clase. Cuando una matriz posee inversa, se puede asumir que su determinante es mayor a cero.


  1. ¿Cómo se propaga una enfermedad contagiosa?. Suponga que un grupo de 4 individuos que llamaremos \(I_{1}, I_{2}, I_{3}, I_{4}\), han contraído una enfermedad.

Este grupo entra en contacto con 6 personas de un segundo grupo: \(P_{1}, P_{2}, P_{3}, P_{4}, P_{5}, P_{6}\). Este tipo de contactos se llaman directos y se pueden representar en una matriz de 4 x 6, como la que se muestra a continuación:

Note que la forma de construir dicha matriz es, colocando un 1 si una persona del primer grupo (contagiados) entra en contacto con alguna persona del segundo grupo.

Llamemos \(A\) a esta matriz de contactos Primer Contacto Directo:

Ahora suponga que las 6 personas del grupo 2 entró en contacto directo con un tercer grupo de cinco personas \(M_{1}, M_{2}, M_{3}, M_{4}, M_{5}, M_{6}\) de la siguiente manera:

Llamamos \(B\) a esta segunda matriz de contacto:


La lógica es igual que en el caso anterior, 1 significa que un individuo del segundo grupo estuvo en contacto con un individuo del tercer grupo. Los contactos indirectos o de segundo orden, se pueden dar entre individuos del primer grupo con individuos del tercer grupo, esto es, que una persona del grupo 3, puede ser contagiada por alguien del grupo 2 que a su vez fue contagiada por alguien del grupo 1. A manera de ejemplo, note que las posiciones \(a_{24}=1\ y \ b_{45}=1\), con esto, se ve que indirectamente la quinta persona del grupo 3, tuvo contacto con una persona del grupo 1 a través de la cuarta persona del grupo 2, así:


Con respecto al caso anterior, realice los siguiente:

  1. Calcule una nueva matriz \(C\), tal que \(C=A \cdot B\) (Tome en cuenta que el producto es matricial, al trabajarlo en R).

a_encabezados = list(c("I1", "I2", "I3", "I4"), c("P1", "P2", "P3", "P4", "P5", "P6"))

a <- matrix(c(0, 1, 0, 0, 1, 0,
              1, 0, 0, 1, 0, 1,
              0, 0, 0, 1, 1, 0,
              1, 0, 0, 0, 0, 1),
              4, 6, byrow=TRUE, dimnames=a_encabezados)

a
   P1 P2 P3 P4 P5 P6
I1  0  1  0  0  1  0
I2  1  0  0  1  0  1
I3  0  0  0  1  1  0
I4  1  0  0  0  0  1
b_encabezados = list(c("P1", "P2", "P3", "P4", "P5", "P6"), c("M1", "M2", "M3", "M4", "M5"))

b <- matrix(c(0, 0, 1, 0, 1,
              0, 0, 0, 1, 0,
              0, 1, 0, 0, 0,
              1, 0, 0, 0, 1,
              0, 0, 0, 1, 0,
              0, 0, 1, 0, 0),
              6, 5, byrow=TRUE, dimnames=b_encabezados)
b
   M1 M2 M3 M4 M5
P1  0  0  1  0  1
P2  0  0  0  1  0
P3  0  1  0  0  0
P4  1  0  0  0  1
P5  0  0  0  1  0
P6  0  0  1  0  0
c <- a%*%b
c
   M1 M2 M3 M4 M5
I1  0  0  0  2  0
I2  1  0  2  0  2
I3  1  0  0  1  1
I4  0  0  2  0  1
  1. ¿Cuáles grupos de individuos (Grupo 1, 2 o 3) están quedando representados en \(C\)?, ¿quiénes están representados en las filas y quiénes en las columnas?

En la matriz \(C\) se están representanto los individuos de los tres grupos, ya que se demuestran los contactos directos e indirectos. Las filas representan a los individuos del grupo 1 (\(I\)) y la sumatoria de la fila representa los contactos indirectos que tuvo el individuo \(I_n\) con miembros del grupo \(M\) a través de miembros del grupo \(P\). Las columnas representan a los miembros del grupo 3 (\(M\)) y la sumatoria de la columna la cantidad total de contactos indirectos que tuvo el individuo (\(M_n\)) con individuos del grupo \(I\) a través de \(P\).

  1. Tome la fila 2 de \(C\) e interprétela (haga la extracción de esta usando un comando apropiado en R).
c[2,]
M1 M2 M3 M4 M5 
 1  0  2  0  2 

El individuo \(I_{2}\) fue la persona que más contagio a miembros del grupo \(M\) de manera indirecta.

  1. Tome la columna 2 y 5 de \(C\) e interprételas (Use comandos apropiados en R para la extracción)
c[,2]
I1 I2 I3 I4 
 0  0  0  0 

El individuo \(M_{2}\) no tuvo contacto con algún \(P\) que tuviera contacto con algún \(I\). Por lo tanto \(M_{2}\) no fue contagiado.

c[,5]
I1 I2 I3 I4 
 0  2  1  1 

El individuo \(M_{5}\) fue el miembro del grupo 3 que más contactos indirectos tuvo con miembros del grupo 1 \(I\).

  1. Interprete la posición \(C_{43}\) (Extraiga la entrada, usando el comando apropiado en R).
c[4,3]
[1] 2

El individuo \(I_4\) tuvo 2 contactos indirectos con el miembro \(M_3\) a través de 2 miembros del grupo 2 (\(P\))

 


Autor Brian Duran

 

LS0tDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQouaW5kZW50IHsNCiBtYXJnaW4tbGVmdDogMzBweDsNCn0NCmBgYA0KYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbGlicmFyeShwcmFjbWEpDQpsaWJyYXJ5KG1vc2FpYykNCmxpYnJhcnkoTUFTUykNCmBgYA0KDQojIyMgQnJpYW4gRHVyw6FuDQohW10oLi4vbG9nb19jaWVuY2lhX2RlX2RhdG9zLnBuZykNCg0KPGgxPjxjZW50ZXI+IFRhcmVhOiBTZXNpw7NuIDQgeSA1IDwvY2VudGVyPjwvaDE+DQoNCjwvYnI+DQoNCiMjIyMgSSBQYXJ0ZQ0KDQo8L2JyPg0KDQoxLiBTZWEgJFA9KDIsMykkLCAkUT0oNSwyKSQsICRSPSgyLC01KSQgeSAkUz0oMSwtMikkLiBDYWxjdWxlICRwcm95X3tcdmVje1BRfX1cdmVje1JTfSQuDQoNCiAgJFx2ZWN7UFF9JA0KDQpgYGB7ciwgY2xhc3Muc291cmNlPSJpbmRlbnQiLCBjbGFzcy5vdXRwdXQ9ImluZGVudCJ9DQpxIDwtIGMoNSwyKQ0KcCA8LSBjKDIsMykNCnBxIDwtIHEgLSBwDQpwcQ0KDQpgYGANCg0KICAkXHZlY3tSU30kDQoNCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCnIgPC0gYygyLC01KQ0KcyA8LSBjKDEsLTIpDQpycyA8LSBzIC0gcg0KcnMNCg0KYGBgDQoNCjwvYnI+DQoNCiRwcm95X3tcdmVje1BRfX1cdmVje1JTfSQNCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KDQpwcm95IDwtIHByb2plY3QocnMsIHBxKQ0KDQpmcmFjdGlvbnMocHJveSkNCg0KYGBgDQoNCjwvYnI+DQoNCjIuIFNlYSAkdSA9ICgtMiwxLDYpJCB5ICR2ID0gKDIsNCw1KSQsIGNvbXBydWViYSBxdWUgZWwgdmVjdG9yICR3JCBkYWRvIHBvciAkdyA9IHUgLSBcZnJhY3t1IFxjZG90IHZ9e1x8dlx8XjJ9IHYkDQpFcyB1biB2ZWN0b3Igb3J0b2dvbmFsIGNvbiAkdiQNCg0KQ2FsY3VsYW1vczoNCg0KJHUgXGNkb3QgdiQNCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KdSA8LSBjKC0yLDEsNikNCnYgPC0gYygyLDQsNSkNCnN1bSh1KnYpDQpgYGANCg0KJHtcfHZcfF4yfSQNCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KDQp2MiA8LSBub3JtKHYsIHR5cGU9IjIiKV4yDQp2Mg0KYGBgDQoNCiR3ID0gdSAtIFxmcmFje3UgXGNkb3Qgdn17XHx2XHxeMn0gdiQNCg0KDQpgYGB7ciwgY2xhc3Muc291cmNlPSJpbmRlbnQiLCBjbGFzcy5vdXRwdXQ9ImluZGVudCJ9DQoNCnByb2RfcHVudG9fdV92ID0gc3VtKHUqdikNCg0KdyA9IHUgLSAoKHByb2RfcHVudG9fdV92IC8gdjIpICogdikNCg0KdyA9IGZyYWN0aW9ucyh3KQ0KDQpzdW0odyp2KQ0KDQpzdWJzcGFjZShhcy5tYXRyaXgodyksYXMubWF0cml4KHYpKQ0KDQoxODAqc3Vic3BhY2UoYXMubWF0cml4KHcpLGFzLm1hdHJpeCh2KSkvcGkNCg0KYGBgDQoNCiRXIF97XGJvdCB9IFYgPyQNCg0KdyBlcyBvcnRvZ29uYWwgY29uIHYsIHlhIHF1ZSBsYSBtw7psdGlwbGljYWNpw7NuIGVudHJlIGVsbG9zIGVzIGlndWFsIGEgY2Vyby4gQWRlbcOhcyBkZSBxdWUgZWwgw6FuZ3VsbyBxdWUgbG9zIHNlcGFyYSBlcyBpZ3VhbCBhICRccGlcIC8yJA0KDQoNCg0KMy4gU2VhbiAkQT0oMywwLDApJCwgJEI9KDEsMCwyKSQsICRDPSgyLDMsMCkkIHB1bnRvcyBlbiBlbCBlc3BhY2lvICgkUl4zJCkuIA0KDQpDb24gZXN0b3MgcHVudG9zOg0KDQogIGEuIERldGVybWluZSBzaSBlbCB0cmnDoW5ndWxvICRBQkMkIGVzIHJlY3TDoW5ndWxvLCBvYnR1c8Ohbmd1bG8gbyBhY3V0w6FuZ3Vsby4NCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KYSA8LSBjKDMsMCwwKQ0KYiA8LSBjKDEsMCwyKQ0KYyA8LSBjKDIsMywwKQ0KDQphYiA8LSBiLWENCmJjIDwtIGMtYg0KY2EgPC0gYS1jDQoNCjE4MCpzdWJzcGFjZShhcy5tYXRyaXgoYWIpLCBhcy5tYXRyaXgoYmMpKS9waQ0KMTgwKnN1YnNwYWNlKGFzLm1hdHJpeChiYyksIGFzLm1hdHJpeChjYSkpL3BpDQoxODAqc3Vic3BhY2UoYXMubWF0cml4KGFiKSwgYXMubWF0cml4KGNhKSkvcGkNCg0KYGBgDQoNCg0KUmVzcHVlc3RhOiBFbCB0cmnDoW5ndWxvIGVzIGFjdXTDoW5ndWxvLCB5YSBxdWUgdG9kb3Mgc3VzIMOhbmd1bG9zIHNlIGVuY3VlbnRyYW4gZW50cmUgMCB5IDkwIGdyYWRvcy4NCg0KDQpiLiBEZXRlcm1pbmUgZWwgcGVyw61tZXRybyBkZWwgdHJpw6FuZ3VsbyAkQUJDJA0KDQpgYGB7ciwgY2xhc3Muc291cmNlPSJpbmRlbnQiLCBjbGFzcy5vdXRwdXQ9ImluZGVudCJ9DQpub3JtYV9hYiA8LSBub3JtKGFiLCB0eXBlPSIyIikNCm5vcm1hX2JjIDwtIG5vcm0oYmMsIHR5cGU9IjIiKQ0Kbm9ybWFfY2EgPC0gbm9ybShjYSwgdHlwZT0iMiIpDQoNCm5vcm1hX2FiICsgbm9ybWFfYmMgKyBub3JtYV9jYQ0KYGBgDQoNCg0KYy4gRGV0ZXJtaW5lIGVsIMOhcmVhIGRlbCB0cmnDoW5ndWxvIEFCQw0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0Kc2VtaXBlcmltZXRybyA8LSBwZXJpbWV0cm8gLyAyDQoNCiMgUG9yIGZvcm11bGEgZGUgSMOpcm9uDQphcmVhID0gc3FydChzZW1pcGVyaW1ldHJvICogKHNlbWlwZXJpbWV0cm8gLSBub3JtYV9hYikgKiAoc2VtaXBlcmltZXRybyAtIG5vcm1hX2JjKSAqIChzZW1pcGVyaW1ldHJvIC0gbm9ybWFfY2EpKQ0KDQphcmVhDQoNCmBgYA0KDQoNCjwvYnI+DQoNCiMjIyMgSUkgUGFydGUNCg0KPC9icj4NCg0KDQoxLiBDb21wcnVlYmUgcXVlIGxhIG1hdHJpeiBQLCBlcyBvcnRvZ29uYWw6DQoNCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCnAgPC0gbWF0cml4KGMoMS8yLCAxLzIsIDEvMiwgMS8yLCANCiAgICAgICAgICAgICAgKDEvc3FydCgyKSksIC0oMS9zcXJ0KDIpKSwgMCwgMCwgDQogICAgICAgICAgICAgICgxL3NxcnQoNikpLCAoMS9zcXJ0KDYpKSwgLSgyL3NxcnQoNikpLCAwLCANCiAgICAgICAgICAgICAgKDEvKDIqc3FydCgzKSkpLCAoMS8oMipzcXJ0KDMpKSksICgxLygyKnNxcnQoMykpKSwgLSgzLygyKnNxcnQoMykpKSksIA0KICAgICAgICAgICAgICBucm93PTQsIG5jb2w9NCwgYnlyb3c9VFJVRSkNCg0KbWF0cml6X3AgPC0gZnJhY3Rpb25zKHApDQoNCm1hdHJpel9wDQoNCg0KcF9pbnZlcnNhIDwtIHNvbHZlKG1hdHJpel9wKQ0KDQpmcmFjdGlvbnMocF9pbnZlcnNhKQ0KDQoNCnBfdHJhbnNwdWVzdGEgPC0gdChwKQ0KDQpmcmFjdGlvbnMocF90cmFuc3B1ZXN0YSkNCg0KYGBgDQoNCkxhIG1hdHJpeiBQIGVzIG9ydG9nb25hbCBwdWVzdG8gcXVlIHN1IGludmVyc2EgeSBzdSB0cmFuc3B1ZXN0YSBzb24gaWd1YWxlcy4NCg0KDQoyLiBEZW11ZXN0cmUgcXVlIEEgZXMgaW5kZW1wb3RlbnRlLg0KDQoNCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCmEgPC0gbWF0cml4KGMoMiwgLTIsIC00LCANCiAgICAgICAgICAgICAgLTEsIDMsIDQsDQogICAgICAgICAgICAgIDEsIC0yLCAtMyksIA0KICAgICAgICAgICAgICAzLCAzLCBieXJvdz1UUlVFKQ0KDQoNCmENCg0KYSUqJWENCg0KYGBgDQoNCg0KTGEgbWF0cml6IEEgZXMgaWRlbXBvdGVudGUgcHVlc3RvIHF1ZSBlcyBpZ3VhbCBhIGVsbGEgbWlzbWEgYWwgY3VhZHJhZG8uDQoNCg0KMy4gRGV0ZXJtaW5lIGxhIGNvbXBvc2ljacOzbiAkZihtKSQNCg0KYGBge3IsIGNsYXNzLnNvdXJjZT0iaW5kZW50IiwgY2xhc3Mub3V0cHV0PSJpbmRlbnQifQ0KbSA8LSBtYXRyaXgoYygzLzIsIC01LzIsIA0KICAgICAgICAgICAgICAyLzMsIC0xLzMpLCANCiAgICAgICAgICAgICAgMiwgMiwgYnlyb3c9VFJVRSkNCg0KZnJhY3Rpb25zKG0pDQoNCm0zIDwtIG0lKiVtJSolbQ0KDQptMiA8LSBtJSolbQ0KDQpmeCA9IDYqbTMgKyAzKm0yIC0gbQ0KDQpmcmFjdGlvbnMoZngpDQoNCmBgYA0KDQoNCg0KNC4gRW5jdWVudHJlIGxhIG1hdHJpeiBpbnZlcnNhIHkgZWwgZGV0ZXJtaW5hbnRlIGRlIGNhZGEgdW5hIGRlIGxhcyBzaWd1aWVudGVzIG1hdHJpY2VzOg0KDQpgYGB7ciwgY2xhc3Muc291cmNlPSJpbmRlbnQiLCBjbGFzcy5vdXRwdXQ9ImluZGVudCJ9DQoNCmEgPC0gbWF0cml4KGMoMSwgMiwgMywgDQogICAgICAgICAgICAgIDIsIDUsIDcsDQogICAgICAgICAgICAgIC0yLCAtNCwgLTUpLCANCiAgICAgICAgICAgICAgMywgMywgYnlyb3c9VFJVRSkNCg0Kc29sdmUoYSkNCmRldChhKQ0KDQpiIDwtIG1hdHJpeChjKDMsIC0yLCAtMSwgDQogICAgICAgICAgICAgIC00LCAxLCAtMSwNCiAgICAgICAgICAgICAgMiwgMCwgMSksIA0KICAgICAgICAgICAgICAzLCAzLCBieXJvdz1UUlVFKQ0KDQpzb2x2ZShiKQ0KZGV0KGIpDQoNCg0KYyA8LSBtYXRyaXgoYygwLCAyLCAxLCANCiAgICAgICAgICAgICAgMSwgMywgLTEsDQogICAgICAgICAgICAgIC0xLCAxLCAyKSwgDQogICAgICAgICAgICAgIDMsIDMsIGJ5cm93PVRSVUUpDQoNCmZyYWN0aW9ucyhzb2x2ZShjKSkNCmRldChjKQ0KDQpkIDwtIG1hdHJpeChjKDMsIDYsIDksIA0KICAgICAgICAgICAgICAyLCA1LCAxLA0KICAgICAgICAgICAgICAxLCAxLCA4KSwgDQogICAgICAgICAgICAgIDMsIDMsIGJ5cm93PVRSVUUpDQoNCmRldChkKQ0KDQpgYGANCg0KTGEgw7psdGltYSBtYXRyaXogbm8gdGllbmUgaW52ZXJzYSBwdWVzdG8gcXVlIGVsIGRldGVybWluYW50ZSBlcyBjZXJvLCBlcyBkZWNpciBsYSBtYXRyaXogZXMgc2luZ3VsYXIgbyBpbnZlcnRpYmxlLg0KDQoNClF1ZSByZWxhY2nDs24gZXhpc3RlIGVudHJlIGxhcyBtYXRyaWNlcyBxdWUgcG9zZWVuIGludmVyc2FzIHkgZWwgdmFsb3IgZGUgc3UgZGV0ZXJtaW5hbnRlPyBTdWc6IHJldmlzYXIgbGEgdGVvcsOtYSB2aXN0YSBlbiBjbGFzZS4NCkN1YW5kbyB1bmEgbWF0cml6IHBvc2VlIGludmVyc2EsIHNlIHB1ZWRlIGFzdW1pciBxdWUgc3UgZGV0ZXJtaW5hbnRlIGVzIG1heW9yIGEgY2Vyby4NCg0KDQo8L2JyPg0KDQo1LiDCv0PDs21vIHNlIHByb3BhZ2EgdW5hIGVuZmVybWVkYWQgY29udGFnaW9zYT8uIFN1cG9uZ2EgcXVlIHVuIGdydXBvIGRlIDQgaW5kaXZpZHVvcyBxdWUgbGxhbWFyZW1vcyAkSV97MX0sIElfezJ9LCBJX3szfSwgSV97NH0kLCBoYW4gY29udHJhw61kbyB1bmEgZW5mZXJtZWRhZC4NCg0KRXN0ZSBncnVwbyBlbnRyYSBlbiBjb250YWN0byBjb24gNiBwZXJzb25hcyBkZSB1biBzZWd1bmRvIGdydXBvOiAkUF97MX0sIFBfezJ9LCBQX3szfSwgUF97NH0sIFBfezV9LCBQX3s2fSQuIEVzdGUgdGlwbyBkZSBjb250YWN0b3Mgc2UgbGxhbWFuIGRpcmVjdG9zIHkgc2UgcHVlZGVuIHJlcHJlc2VudGFyIGVuIHVuYSBtYXRyaXogZGUgNCB4IDYsIGNvbW8gbGEgcXVlIHNlIG11ZXN0cmEgYSBjb250aW51YWNpw7NuOg0KDQo8Y2VudGVyPiFbXShtYXRyaXpfY29udGFnaW8ucG5nKTwvY2VudGVyPg0KDQpOb3RlIHF1ZSBsYSBmb3JtYSBkZSBjb25zdHJ1aXIgZGljaGEgbWF0cml6IGVzLCBjb2xvY2FuZG8gdW4gMSBzaSB1bmEgcGVyc29uYSBkZWwgcHJpbWVyIGdydXBvIChjb250YWdpYWRvcykgZW50cmEgZW4gY29udGFjdG8gY29uIGFsZ3VuYSBwZXJzb25hIGRlbCBzZWd1bmRvIGdydXBvLg0KDQpMbGFtZW1vcyAkQSQgYSBlc3RhIG1hdHJpeiBkZSBjb250YWN0b3MgUHJpbWVyIENvbnRhY3RvIERpcmVjdG86DQoNCjxjZW50ZXI+IVtdKG1hdHJpel9hLnBuZyk8L2NlbnRlcj4NCg0KQWhvcmEgc3Vwb25nYSBxdWUgbGFzIDYgcGVyc29uYXMgZGVsIGdydXBvIDIgZW50csOzIGVuIGNvbnRhY3RvIGRpcmVjdG8gY29uIHVuIHRlcmNlciBncnVwbw0KZGUgY2luY28gcGVyc29uYXMgJE1fezF9LCBNX3syfSwgTV97M30sIE1fezR9LCBNX3s1fSwgTV97Nn0kIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNCjxjZW50ZXI+IVtdKG1hdHJpel9jb250YWdpb19pbmRpcmVjdG8ucG5nKTwvY2VudGVyPg0KDQpMbGFtYW1vcyAkQiQgYSBlc3RhIHNlZ3VuZGEgbWF0cml6IGRlIGNvbnRhY3RvOg0KDQo8Y2VudGVyPiFbXShtYXRyaXpfYi5wbmcpPC9jZW50ZXI+DQoNCjwvYnI+DQoNCkxhIGzDs2dpY2EgZXMgaWd1YWwgcXVlIGVuIGVsIGNhc28gYW50ZXJpb3IsIDEgc2lnbmlmaWNhIHF1ZSB1biBpbmRpdmlkdW8gZGVsIHNlZ3VuZG8gZ3J1cG8gZXN0dXZvIGVuIGNvbnRhY3RvIGNvbiB1biBpbmRpdmlkdW8gZGVsIHRlcmNlciBncnVwby4gTG9zIGNvbnRhY3RvcyBpbmRpcmVjdG9zIG8gZGUgc2VndW5kbyBvcmRlbiwgc2UgcHVlZGVuIGRhciBlbnRyZSBpbmRpdmlkdW9zIGRlbCBwcmltZXIgZ3J1cG8gY29uIGluZGl2aWR1b3MgZGVsIHRlcmNlciBncnVwbywgZXN0byBlcywgcXVlIHVuYSBwZXJzb25hIGRlbCBncnVwbyAzLCBwdWVkZSBzZXIgY29udGFnaWFkYSBwb3IgYWxndWllbiBkZWwgZ3J1cG8gMiBxdWUgYSBzdSB2ZXogZnVlIGNvbnRhZ2lhZGEgcG9yIGFsZ3VpZW4gZGVsIGdydXBvIDEuIEEgbWFuZXJhIGRlIGVqZW1wbG8sIG5vdGUgcXVlIGxhcyBwb3NpY2lvbmVzICRhX3syNH09MVwgeSBcIGJfezQ1fT0xJCwgY29uIGVzdG8sIHNlIHZlIHF1ZSBpbmRpcmVjdGFtZW50ZSBsYSBxdWludGEgcGVyc29uYSBkZWwgZ3J1cG8gMywgdHV2byBjb250YWN0byBjb24gdW5hIHBlcnNvbmEgZGVsIGdydXBvIDEgYSB0cmF2w6lzIGRlIGxhIGN1YXJ0YSBwZXJzb25hIGRlbCBncnVwbyAyLCBhc8OtOg0KDQo8Y2VudGVyPiFbXShhcnJvd3MucG5nKTwvY2VudGVyPg0KDQo8L2JyPg0KDQpDb24gcmVzcGVjdG8gYWwgY2FzbyBhbnRlcmlvciwgcmVhbGljZSBsb3Mgc2lndWllbnRlOg0KDQphLiBDYWxjdWxlIHVuYSBudWV2YSBtYXRyaXogJEMkLCB0YWwgcXVlICRDPUEgXGNkb3QgQiQgKFRvbWUgZW4gY3VlbnRhIHF1ZSBlbCBwcm9kdWN0byBlcyBtYXRyaWNpYWwsIGFsIHRyYWJhamFybG8gZW4gUikuDQoNCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCg0KYV9lbmNhYmV6YWRvcyA9IGxpc3QoYygiSTEiLCAiSTIiLCAiSTMiLCAiSTQiKSwgYygiUDEiLCAiUDIiLCAiUDMiLCAiUDQiLCAiUDUiLCAiUDYiKSkNCg0KYSA8LSBtYXRyaXgoYygwLCAxLCAwLCAwLCAxLCAwLA0KICAgICAgICAgICAgICAxLCAwLCAwLCAxLCAwLCAxLA0KICAgICAgICAgICAgICAwLCAwLCAwLCAxLCAxLCAwLA0KICAgICAgICAgICAgICAxLCAwLCAwLCAwLCAwLCAxKSwNCiAgICAgICAgICAgICAgNCwgNiwgYnlyb3c9VFJVRSwgZGltbmFtZXM9YV9lbmNhYmV6YWRvcykNCg0KYQ0KDQpiX2VuY2FiZXphZG9zID0gbGlzdChjKCJQMSIsICJQMiIsICJQMyIsICJQNCIsICJQNSIsICJQNiIpLCBjKCJNMSIsICJNMiIsICJNMyIsICJNNCIsICJNNSIpKQ0KDQpiIDwtIG1hdHJpeChjKDAsIDAsIDEsIDAsIDEsDQogICAgICAgICAgICAgIDAsIDAsIDAsIDEsIDAsDQogICAgICAgICAgICAgIDAsIDEsIDAsIDAsIDAsDQogICAgICAgICAgICAgIDEsIDAsIDAsIDAsIDEsDQogICAgICAgICAgICAgIDAsIDAsIDAsIDEsIDAsDQogICAgICAgICAgICAgIDAsIDAsIDEsIDAsIDApLA0KICAgICAgICAgICAgICA2LCA1LCBieXJvdz1UUlVFLCBkaW1uYW1lcz1iX2VuY2FiZXphZG9zKQ0KYg0KDQpjIDwtIGElKiViDQpjDQoNCmBgYA0KDQpiLiDCv0N1w6FsZXMgZ3J1cG9zIGRlIGluZGl2aWR1b3MgKEdydXBvIDEsIDIgbyAzKSBlc3TDoW4gcXVlZGFuZG8gcmVwcmVzZW50YWRvcyBlbiAkQyQ/LCDCv3F1acOpbmVzIGVzdMOhbiByZXByZXNlbnRhZG9zIGVuIGxhcyBmaWxhcyB5IHF1acOpbmVzIGVuIGxhcyBjb2x1bW5hcz8NCg0KRW4gbGEgbWF0cml6ICRDJCBzZSBlc3TDoW4gcmVwcmVzZW50YW50byBsb3MgaW5kaXZpZHVvcyBkZSBsb3MgdHJlcyBncnVwb3MsIHlhIHF1ZSBzZSBkZW11ZXN0cmFuIGxvcyBjb250YWN0b3MgZGlyZWN0b3MgZSBpbmRpcmVjdG9zLiBMYXMgZmlsYXMgcmVwcmVzZW50YW4gYSBsb3MgaW5kaXZpZHVvcyBkZWwgZ3J1cG8gMSAoJEkkKSB5IGxhIHN1bWF0b3JpYSBkZSBsYSBmaWxhIHJlcHJlc2VudGEgbG9zIGNvbnRhY3RvcyBpbmRpcmVjdG9zIHF1ZSB0dXZvIGVsIGluZGl2aWR1byAkSV9uJCBjb24gbWllbWJyb3MgZGVsIGdydXBvICRNJCBhIHRyYXbDqXMgZGUgbWllbWJyb3MgZGVsIGdydXBvICRQJC4gTGFzIGNvbHVtbmFzIHJlcHJlc2VudGFuIGEgbG9zIG1pZW1icm9zIGRlbCBncnVwbyAzICgkTSQpIHkgbGEgc3VtYXRvcmlhIGRlIGxhIGNvbHVtbmEgbGEgY2FudGlkYWQgdG90YWwgZGUgY29udGFjdG9zIGluZGlyZWN0b3MgcXVlIHR1dm8gZWwgaW5kaXZpZHVvICgkTV9uJCkgY29uIGluZGl2aWR1b3MgZGVsIGdydXBvICRJJCBhIHRyYXbDqXMgZGUgJFAkLg0KDQoNCmMuIFRvbWUgbGEgZmlsYSAyIGRlICRDJCBlIGludGVycHLDqXRlbGEgKGhhZ2EgbGEgZXh0cmFjY2nDs24gZGUgZXN0YSB1c2FuZG8gdW4gY29tYW5kbyBhcHJvcGlhZG8gZW4gUikuDQpgYGB7ciwgY2xhc3Muc291cmNlPSJpbmRlbnQiLCBjbGFzcy5vdXRwdXQ9ImluZGVudCJ9DQpjWzIsXQ0KYGBgDQoNCkVsIGluZGl2aWR1byAkSV97Mn0kIGZ1ZSBsYSBwZXJzb25hIHF1ZSBtw6FzIGNvbnRhZ2lvIGEgbWllbWJyb3MgZGVsIGdydXBvICRNJCBkZSBtYW5lcmEgaW5kaXJlY3RhLg0KDQoNCmQuIFRvbWUgbGEgY29sdW1uYSAyIHkgNSBkZSAkQyQgZSBpbnRlcnByw6l0ZWxhcyAoVXNlIGNvbWFuZG9zIGFwcm9waWFkb3MgZW4gUiBwYXJhIGxhIGV4dHJhY2Npw7NuKQ0KDQpgYGB7ciwgY2xhc3Muc291cmNlPSJpbmRlbnQiLCBjbGFzcy5vdXRwdXQ9ImluZGVudCJ9DQpjWywyXQ0KYGBgDQoNCkVsIGluZGl2aWR1byAkTV97Mn0kIG5vIHR1dm8gY29udGFjdG8gY29uIGFsZ8O6biAkUCQgcXVlIHR1dmllcmEgY29udGFjdG8gY29uIGFsZ8O6biAkSSQuIFBvciBsbyB0YW50byAkTV97Mn0kIG5vIGZ1ZSBjb250YWdpYWRvLg0KDQoNCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCmNbLDVdDQpgYGANCg0KRWwgaW5kaXZpZHVvICRNX3s1fSQgZnVlIGVsIG1pZW1icm8gZGVsIGdydXBvIDMgcXVlIG3DoXMgY29udGFjdG9zIGluZGlyZWN0b3MgdHV2byBjb24gbWllbWJyb3MgZGVsIGdydXBvIDEgJEkkLg0KDQoNCmUuIEludGVycHJldGUgbGEgcG9zaWNpw7NuICRDX3s0M30kIChFeHRyYWlnYSBsYSBlbnRyYWRhLCB1c2FuZG8gZWwgY29tYW5kbyBhcHJvcGlhZG8gZW4gUikuDQoNCmBgYHtyLCBjbGFzcy5zb3VyY2U9ImluZGVudCIsIGNsYXNzLm91dHB1dD0iaW5kZW50In0NCmNbNCwzXQ0KYGBgDQoNCkVsIGluZGl2aWR1byAkSV80JCB0dXZvICoqMioqIGNvbnRhY3RvcyBpbmRpcmVjdG9zIGNvbiBlbCBtaWVtYnJvICRNXzMkIGEgdHJhdsOpcyBkZSAyIG1pZW1icm9zIGRlbCBncnVwbyAyICgkUCQpDQoNCg0KPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT4NCjwhLS0NCkVzdGEgc2VjY2nDs24gZXMgc29sbyBwYXJhIGFncmVnYXIgZXN0aWxvcyB5IGVsZW1lbnRvcyANCnBlcnNvbmFsaXphZG9zIGFsIGh0bWwgZ2VuZXJhZG8gcG9yIHJTdHVkaW8gIA0KLS0+DQo8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPg0KDQombmJzcDsNCg0KPGhyIC8+DQo8cCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+QXV0b3IgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2JkdXJhbnMiPkJyaWFuIER1cmFuPC9hPjwvcD4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48c3BhbiBzdHlsZT0iY29sb3I6ICM4MDgwODA7Ij48ZW0+YmR1cmFuMDM5M0BnbWFpbC5jb208L2VtPjwvc3Bhbj48L3A+DQoNCjwhLS0gQWRkIGljb24gbGlicmFyeSAtLT4NCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZm9udC1hd2Vzb21lLzQuNy4wL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyI+DQoNCjwhLS0gQWRkIGZvbnQgYXdlc29tZSBpY29ucyAtLT4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCiAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmR1cmFucy90ZWNfZGF0YV9zY2llbmNlX2NvdXJzZS90cmVlL21hc3Rlci9tYXRoZW1hdGljc19mb3JfZGF0YV9zY2llbmNlL3Nlc3Npb25fNF9hbmRfNV9ob21ld29yayIgY2xhc3M9ImZhIGZhLWdpdGh1YiI+PC9hPg0KPC9wPg0KDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmR1cmFucy90ZWNfZGF0YV9zY2llbmNlX2NvdXJzZS90cmVlL21hc3Rlci9tYXRoZW1hdGljc19mb3JfZGF0YV9zY2llbmNlL3Nlc3Npb25fNF9hbmRfNV9ob21ld29yayIgY2xhc3M9ImdpdGh1Yi1jb3JuZXIiIGFyaWEtbGFiZWw9IlZpZXcgc291cmNlIG9uIEdpdEh1YiI+PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCAyNTAgMjUwIiBzdHlsZT0iZmlsbDojMTUxNTEzOyBjb2xvcjojZmZmOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgYm9yZGVyOiAwOyByaWdodDogMDsiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNMCwwIEwxMTUsMTE1IEwxMzAsMTE1IEwxNDIsMTQyIEwyNTAsMjUwIEwyNTAsMCBaIj48L3BhdGg+PHBhdGggZD0iTTEyOC4zLDEwOS4wIEMxMTMuOCw5OS43IDExOS4wLDg5LjYgMTE5LjAsODkuNiBDMTIyLjAsODIuNyAxMjAuNSw3OC42IDEyMC41LDc4LjYgQzExOS4yLDcyLjAgMTIzLjQsNzYuMyAxMjMuNCw3Ni4zIEMxMjcuMyw4MC45IDEyNS41LDg3LjMgMTI1LjUsODcuMyBDMTIyLjksOTcuNiAxMzAuNiwxMDEuOSAxMzQuNCwxMDMuMiIgZmlsbD0iY3VycmVudENvbG9yIiBzdHlsZT0idHJhbnNmb3JtLW9yaWdpbjogMTMwcHggMTA2cHg7IiBjbGFzcz0ib2N0by1hcm0iPjwvcGF0aD48cGF0aCBkPSJNMTE1LjAsMTE1LjAgQzExNC45LDExNS4xIDExOC43LDExNi41IDExOS44LDExNS40IEwxMzMuNywxMDEuNiBDMTM2LjksOTkuMiAxMzkuOSw5OC40IDE0Mi4yLDk4LjYgQzEzMy44LDg4LjAgMTI3LjUsNzQuNCAxNDMuOCw1OC4wIEMxNDguNSw1My40IDE1NC4wLDUxLjIgMTU5LjcsNTEuMCBDMTYwLjMsNDkuNCAxNjMuMiw0My42IDE3MS40LDQwLjEgQzE3MS40LDQwLjEgMTc2LjEsNDIuNSAxNzguOCw1Ni4yIEMxODMuMSw1OC42IDE4Ny4yLDYxLjggMTkwLjksNjUuNCBDMTk0LjUsNjkuMCAxOTcuNyw3My4yIDIwMC4xLDc3LjYgQzIxMy44LDgwLjIgMjE2LjMsODQuOSAyMTYuMyw4NC45IEMyMTIuNyw5My4xIDIwNi45LDk2LjAgMjA1LjQsOTYuNiBDMjA1LjEsMTAyLjQgMjAzLjAsMTA3LjggMTk4LjMsMTEyLjUgQzE4MS45LDEyOC45IDE2OC4zLDEyMi41IDE1Ny43LDExNC4xIEMxNTcuOSwxMTYuOSAxNTYuNywxMjAuOSAxNTIuNywxMjQuOSBMMTQxLjAsMTM2LjUgQzEzOS44LDEzNy43IDE0MS42LDE0MS45IDE0MS44LDE0MS44IFoiIGZpbGw9ImN1cnJlbnRDb2xvciIgY2xhc3M9Im9jdG8tYm9keSI+PC9wYXRoPjwvc3ZnPjwvYT48c3R5bGU+LmdpdGh1Yi1jb3JuZXI6aG92ZXIgLm9jdG8tYXJte2FuaW1hdGlvbjpvY3RvY2F0LXdhdmUgNTYwbXMgZWFzZS1pbi1vdXR9QGtleWZyYW1lcyBvY3RvY2F0LXdhdmV7MCUsMTAwJXt0cmFuc2Zvcm06cm90YXRlKDApfTIwJSw2MCV7dHJhbnNmb3JtOnJvdGF0ZSgtMjVkZWcpfTQwJSw4MCV7dHJhbnNmb3JtOnJvdGF0ZSgxMGRlZyl9fUBtZWRpYSAobWF4LXdpZHRoOjUwMHB4KXsuZ2l0aHViLWNvcm5lcjpob3ZlciAub2N0by1hcm17YW5pbWF0aW9uOm5vbmV9LmdpdGh1Yi1jb3JuZXIgLm9jdG8tYXJte2FuaW1hdGlvbjpvY3RvY2F0LXdhdmUgNTYwbXMgZWFzZS1pbi1vdXR9fTwvc3R5bGU+DQoNCjxzY3JpcHQ+DQokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7DQogICAgJCgncHJlLnInKS5hZGRDbGFzcygnaW5kZW50Jyk7DQogICAgJCgncCcpLmFkZENsYXNzKCdpbmRlbnQnKTsNCn0pOw0KPC9zY3JpcHQ+DQoNCjxzdHlsZT4NCi5pbmRlbnQgew0KIG1hcmdpbi1sZWZ0OiAzMHB4Ow0KfQ0KPC9zdHlsZT4NCg0KJm5ic3A7DQo=